package jmine.tec.database.pack.services;

import java.io.Serializable;

import jmine.tec.database.pack.PackException;
import bancosys.tec.persist.Persistable;

/**
 * Interface para auxiliar na escrita de serviços que são utilizados em pack, que são obrigados a respeitar determinadas regras para fazer
 * find/replace e save. <br/>
 * <br/>
 * <br/>
 * É fortemente aconselhável que a implementação seja estrita com relação à PK.
 * 
 * @author lundberg
 */
public interface PackEntityPersistenceHelper {

    /**
     * Busca ou cria uma instância da entidade, pronta para edição
     * 
     * @param <T> tipo genérico da entidade
     * @param entityClass entityClass
     * @param pk pk
     * @param naturalKey naturalKey
     * @return instância
     * @throws PackException PackException
     */
    <T extends Persistable> T findOrCreate(Class<T> entityClass, Serializable pk, String naturalKey) throws PackException;

    /**
     * Salva a entidade
     * 
     * @param <T> tipo genérico da entidade
     * @param entity entity
     * @param pk pk
     * @throws PackException PackException
     */
    <T extends Persistable> void save(T entity, Serializable pk) throws PackException;
}
